function* generator() { //状态机，内部封装多个函数
  yield 'hello'; //产出
  yield 'world';
  return 'ending';
}

let iter = generator();
// iter.next() 返回值为  {value: 'hello', done: false}

//调用Generator函数后，该函数并不执行，返回的也不是函数运行结果，而是一个指向内部状态的指针对象

//调用遍历器对象的next方法,函数才会执行。直到遇到 yield

//Generator函数可以不用yield语句，这时就变成了一个单纯的暂缓执行函数

//注意，yield语句不能用在普通函数中, 只能在generator函数中


//Generator是实现状态机的最佳结构
//ES5 way
var ticking = true;
var clock = function() {
  if (ticking)
    console.log('Tick!');
  else
    console.log('Tock!');
  ticking = !ticking;
} 
//ES6 way
var clock = function*() {
  while (true) {
    console.log('Tick!');
    yield;
    console.log('Tock!');
    yield;
  }
};

// 状态机, 有点意思啊, 好好品味里面的内涵
iter = clock()
for(let i = 0; i < 10; i++) {
  iter.next()
}

// 注入yield的返回值
function* foo(x) {
  var y = 2 * (yield (x + 1));
  var z = yield (y / 3);
  return (x + y + z);
}

//调用Generator函数后，该函数并不执行，返回的是一个遍历器, 调用遍历器的next()方法才会执行函数, 遇到yield则暂停, 遇到return则结束
var a = foo(5);
console.log('------默认yield返回undefined------')
console.log(a.next()) // Object{value:6, done:false}
console.log(a.next()) // Object{value:NaN, done:false}
console.log(a.next()) // Object{value:NaN, done:true}

var b = foo(5);
console.log('------注入yield的返回值------')
console.log(b.next('first next')) // { value:6, done:false }
console.log(b.next(12)) // { value:8, done:false }
console.log(b.next(13)) // { value:42, done:true }
 
 
 
